/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.apresentacao;
import telas.TelaGerenciaReserva;
import javax.swing.JOptionPane;
import java.util.ArrayList;
import interfaces.IGerenciaReserva;
import entidades.Voo;
import entidades.Reserva;
import entidades.Cliente;
import controladoras.apresentacao.modelos.ModeloGerenciaReserva;
import erros.ErroAtualizacao;
/**
 * Classe que implementa a controladora de interação de reserva.
 * @author thiagostuckert
 */
public class CntrIntReserva {
    /**
     * Variavel de referencia para o objeto
     * singleton a ser criado.
     */
    private static CntrIntReserva ref;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de gerencia de reserva.
     */
    private TelaGerenciaReserva telaGerenciaReserva;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na interface
     * de gerencia de reserva.
     */
    private IGerenciaReserva cntrGerenciaReserva;
    /**
     * Atributo utilizado para a edição de reservas.
     */
    private ArrayList<Reserva> listaReservas = new ArrayList();
    /**
     * Atributo utilizado para recuperar todas as reservas do cliente.
     */
    private ArrayList<Reserva> reservasParam = new ArrayList();
    /**
     * Atributo utilizado para a chamada dos metodos definidos no modelo
     * da tabela de gerencia de aeroporto.
     */
    private ModeloGerenciaReserva modeloGerenciaReserva;
    /**
     * Atributo cliente.
     */
    private Cliente cliente;
    /**
     * Inicia a execução através da tela de gerência de reservas
     * e inicializa sua controladora de tela.
     * @param clienteParam cliente que esta
     * solicitando gerenciar suas reservas.
     */
    public final void mostrarTelaGerenciaReserva(final Cliente clienteParam) {
        try {

            cliente = clienteParam;
            telaGerenciaReserva = TelaGerenciaReserva.instanciar();
            telaGerenciaReserva.setControladoraInteracao(this);
            modeloGerenciaReserva = ModeloGerenciaReserva.instanciar();
            reservasParam = cntrGerenciaReserva.recuperarReservas(cliente);
            copiaLista();
            modeloGerenciaReserva.setRows(reservasParam);
            telaGerenciaReserva.setVisible(true);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaReserva, e.getMessage());
        }
   }

    /**
     * Metodo que copia o conteudo de um ArrayList para outro.
     */
    public final void copiaLista() {
        for (int i = 0; i < reservasParam.size(); i++) {
            Reserva reserva = new Reserva(reservasParam.get(i).getReserva());
            listaReservas.add(reserva);
        }
    }

   /**
    * Metodo que chama a controladora de negócio para a adição de reserva.
    * @param nVoos Quantidade de voos que se deseja adicionar.
    * @param voo1 Numero de voo que se deseja adicionar.
    * @param voo2 Numero de voo que se deseja adicionar.
    * @param voo3 Numero de voo que se deseja adicionar.
    * @param voo4 Numero de voo que se deseja adicionar.
    * @param voo5 Numero de voo que se deseja adicionar.
    */
   public final void addReservas(final String nVoos, final String voo1,
            final String voo2, final String voo3, final String voo4,
            final String voo5) {

       modeloGerenciaReserva = ModeloGerenciaReserva.instanciar();

       int qtd;
       qtd = Integer.parseInt(nVoos);
       Reserva reserva = new Reserva();
       try {
            if (qtd == 1) {
                Voo v1 = new Voo(voo1);
                reserva.adicionaVoo(v1);
            } else if (qtd == 2) {
                Voo v1 = new Voo(voo1);
                Voo v2 = new Voo(voo2);
                reserva.adicionaVoo(v1);
                reserva.adicionaVoo(v2);
            } else if (qtd == 3) {
                Voo v1 = new Voo(voo1);
                Voo v2 = new Voo(voo2);
                Voo v3 = new Voo(voo3);
                reserva.adicionaVoo(v1);
                reserva.adicionaVoo(v2);
                reserva.adicionaVoo(v3);
            } else if (qtd == 4) {
                Voo v1 = new Voo(voo1);
                Voo v2 = new Voo(voo2);
                Voo v3 = new Voo(voo3);
                Voo v4 = new Voo(voo4);
                reserva.adicionaVoo(v1);
                reserva.adicionaVoo(v2);
                reserva.adicionaVoo(v3);
                reserva.adicionaVoo(v4);
            } else if (qtd == 5) {
                Voo v1 = new Voo(voo1);
                Voo v2 = new Voo(voo2);
                Voo v3 = new Voo(voo3);
                Voo v4 = new Voo(voo4);
                Voo v5 = new Voo(voo5);
                reserva.adicionaVoo(v1);
                reserva.adicionaVoo(v2);
                reserva.adicionaVoo(v3);
                reserva.adicionaVoo(v4);
                reserva.adicionaVoo(v5);
            } else {
                JOptionPane.showMessageDialog(telaGerenciaReserva,
                        "Numero de Voos invalido");
                return;
            }

            cntrGerenciaReserva.cadastrarReserva(cliente, reserva);
            modeloGerenciaReserva.addRow(reserva);
            JOptionPane.showMessageDialog(telaGerenciaReserva,
                    "Reserva e Voos cadastrados com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaReserva, e.getMessage());
            return;
        }
    }

    /**
     * Método que chama a controladora de negócio para a remoção de reserva.
     * @param linha linha da tabela onde está a reserva a ser removida.
     */
    public final void delReserva(final int linha) {
        modeloGerenciaReserva = ModeloGerenciaReserva.instanciar();
        try {
            Reserva reserva = new Reserva((String) modeloGerenciaReserva.
                    getValueAt(linha, 0));
            reserva = cntrGerenciaReserva.recuperarReserva(reserva);
            cntrGerenciaReserva.delReserva(cliente, reserva);
            modeloGerenciaReserva.delRow(linha);
            JOptionPane.showMessageDialog(telaGerenciaReserva,
                    "Dados deletados com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaReserva, e.getMessage());
        }
    }

    /**
     * Metodo que chama a controladora de negocio para atualização de reserva.
     * @param reservaVelha Reserva a ter seus dados atualizados.
     * @param reservaNova Reserva com os novos dados.
     * @throws exceção é tratada no modelo da tabela.
     */
    public final void upReserva(final Reserva reservaVelha,
            final Reserva reservaNova) throws ErroAtualizacao{
        cntrGerenciaReserva.atualizarReserva(reservaVelha, reservaNova);
        JOptionPane.showMessageDialog(telaGerenciaReserva,
                     "Reserva alterada com sucesso");
    }

    /**
     * Metodo que instancia a contraladora de interação de reserva.
     * @return Controladora de interação de reserva instanciada
     */
    public static CntrIntReserva instanciar() {
        if (ref == null) {
            ref = new CntrIntReserva();
        }
        return ref;
    }
    /**
     * Metodo que fecha a tela de gerencia de reserva.
     */
    public final void encerrarGerenciaReserva() {
        telaGerenciaReserva.setVisible(false);
    }

    /**
     * Metodo que atribui uma controladora a outra.
     * @param cntr controladora a ser atribuida.
     */
    public final void setCntrGerenciaReserva(final IGerenciaReserva cntr) {
        cntrGerenciaReserva = cntr;
    }
}
